/*
 * 描述： <描述>
 * 修改人： rain
 * 修改时间： 2016年7月25日
 * 项目： rainhy-minitools
 */
package com.rainhy.minitools.sudoku;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

/**
 * 格子
 * 
 * @author rain
 * @version [版本号, 2016年7月25日]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public class Grid implements Serializable {
    private static final long serialVersionUID = 3652616355316446629L;
    
    /** 列 */
    private final int x;
    
    /** 行 */
    private final int y;
    
    /** 值 */
    private int value;
    
    /** 不能填充的数字(// TODO 这里可以改成 二进制数,用 and 和 or 来进行保存,提高效率) */
    private Set<Integer> notFillValueSet = new HashSet<Integer>();
    
    public Grid(int x, int y) {
        super();
        this.x = x;
        this.y = y;
        this.value = 0;
    }
    
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Grid other = (Grid) obj;
        if (x != other.x)
            return false;
        if (y != other.y)
            return false;
        return true;
    }
    
    /** 填充格子 */
    public void fill(int value) {
        this.value = value;
    }
    
    /** 值 */
    public int getValue() {
        return value;
    }
    
    /** 列 */
    public int getX() {
        return x;
    }
    
    /** 行 */
    public int getY() {
        return y;
    }
    
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + x;
        result = prime * result + y;
        return result;
    }
    
    /** 返回格子坐标 */
    public String toStringPoint() {
        return "(" + this.x + ", " + this.y + ")";
    }
    
    @Override
    public String toString() {
        return this.value + "(" + this.x + ", " + this.y + ")";
    }
    
    /** 添加不能填入的数字(已经确定的真的不能填充的数字,而不是 fill 进来的格子数字) */
    public void addNotFillValue(int notFillValue) {
        this.notFillValueSet.add(notFillValue);
    }
}
